package com.demo.config;

import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.util.Set;

public class CustomSpringServletContainerInitializer implements ServletContainerInitializer {
    /*
        SPI: Service Provider Interface，服务提供者接口
        JDK 内置的一种服务提供发现机制，它是一种动态替换发现服务实现者的机制。
        简单地理解，这是建立在面向接口编程下的一种为了使组件可扩展或动态变更实现的规范。
        “基于接口的编程＋策略模式＋配置文件”组合实现的动态加载机制。
        SPI旨在实现为某个接口寻找服务，类似于IOC的思想，是反射机制，核心思想是解耦。

        举个栗子:
        Class A implements B {}
        A 的 implements B 是通过 SPI 方式创建的，
        可如果 A 实现类中调用了 Spring 容器管理的其他Service，
        则会出现 null 异常，因为 A 实现类的生命周期并没有交给 Spring 容器管理。

        自定义SPI
        1、加载 META-INF 目录下的 spi 接口文件
        2、将实例化的 Bean 注册到 Spring 的容器中
     */
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        System.out.println("东莞理工学院");
    }
}
